Skip to content

feat(schema): declare a generated-from relationship - #49

Merged
rldyourmnd merged 3 commits into
mainfrom
feat/generated-from-relationship
Aug 28, 2026
Merged

feat(schema): declare a generated-from relationship#49
rldyourmnd merged 3 commits into
mainfrom
feat/generated-from-relationship

Conversation

@rldyourmnd

Copy link
Copy Markdown
Contributor

Closes #48.

A repository that is rendered by another had no way to say so. relationships[] was a closed enum of eight types and none of them meant "generates". The nearest neighbour, embedded-context-source, means context embedding and requires a materialization value, so using it would have made the anchor assert something untrue.

Direction

The edge is declared on the rendered repository and names its generator — the same direction as fork-of:

relationships:
  - type: "generated-from"
    target: "repo_01JEXAMPZ0000000000000000D"

Declaring it the other way would put a list of every rendered tree inside one generator anchor. That is a second copy of a fact the renderer already owns, and it drifts exactly when a tree is added or removed. The direction also decides whether the fact is checkable: a rendered tree asserting "I came from X" can be verified against the generator's output, while a generator asserting "I produce these seven" has nothing local to check it against.

Semantics

generated-from derives no consumer edge and requires no module.consumption declaration — nothing is vendored, pinned or executed from the generator. It is not a dependency. An absent generator is still reported as GDS_IDENTITY_INDEX_TARGET_MISSING like any other typed relationship, so the edge cannot silently point at nothing.

Additive: it cannot invalidate an existing anchor.

Real consumer

NDDev-it-com/setup-systems renders the seven public *-setup-system trees, with a check that clones all seven and requires byte-for-byte equality with the rendered output. That relationship is enforced in their tooling but was invisible to GDS and could only be stated as prose in product.purpose.

Verification

  • Two new tests in core/estate: one proves the edge is recorded without deriving a consumer or demanding a consumption declaration, the other proves an absent generator is still a missing target.
  • New schema fixture valid-generated-repository.yaml registered in cases.json.
  • scripts/validate_ci_tier.sh pr-required passes, including GDS integrated assurance: PASS.
  • Projection regenerated through plan/apply, since the schema change moved the policy source tree digest. Only provenance digests move; the generated workflow's own output digest is unchanged.

https://claude.ai/code/session_01HMPUfMTrzqwrcgDCFvjnFG

A repository that is rendered by another had no way to say so. The closest
existing type, embedded-context-source, means context embedding and requires a
materialization value, so using it would have made the anchor assert something
untrue.

The edge is declared on the rendered repository and names its generator, the
same direction as fork-of. Declaring it the other way would put a list of every
rendered tree inside one generator anchor, which is a second copy of a fact the
renderer already owns and drifts exactly when trees are added or removed.

It derives no consumer edge and requires no module.consumption declaration:
nothing is vendored, pinned or executed from the generator. An absent generator
is still reported as a missing target.

Closes #48

Claude-Session: https://claude.ai/code/session_01HMPUfMTrzqwrcgDCFvjnFG
Adding the relationship enum member changed the policy source tree, so the
committed bundle lock and the generated workflow header carried a stale
source-tree digest. Regenerated through plan/apply; only provenance digests
move and the workflow's own output digest is unchanged.

Claude-Session: https://claude.ai/code/session_01HMPUfMTrzqwrcgDCFvjnFG
The rendered tree can be verified against its generator's output; a generator
listing its outputs has nothing local to check that list against.

Claude-Session: https://claude.ai/code/session_01HMPUfMTrzqwrcgDCFvjnFG
@rldyourmnd
rldyourmnd merged commit a364c94 into main Aug 28, 2026
7 checks passed
@rldyourmnd
rldyourmnd deleted the feat/generated-from-relationship branch August 28, 2026 10:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

relationships: no way to declare that one repository renders another

1 participant